﻿using System;

namespace LAPI.Core
{
    public static class TimeExtension
    {
        /// <summary>
        /// Recupera un DateTime que representa la media noche del dia indicado
        /// </summary>
        /// <param name="current">fecha indicada</param>
        /// <returns>DateTime con la media noche del dia indicado</returns>
        public static DateTime Midnight(this DateTime current)
        {
            var midnight = new DateTime(current.Year, current.Month, current.Day);
            return midnight;
        }

        /// <summary>
        /// Recupera un DateTime que representa el media dia del dia indicado
        /// </summary>
        /// <param name="current">fecha indicada</param>
        /// <returns>DateTime con el media dia del dia indicado</returns>
        public static DateTime Noon(this DateTime current)
        {
            var noon = new DateTime(current.Year, current.Month, current.Day, 12, 0, 0);
            return noon;
        }

        /// <summary>
        /// Modifica un DateTime, para establecer las horas y minutos que se indiquen
        /// </summary>
        /// <param name="current">fecha indicada</param>
        /// <param name="hour">hora indicada</param>
        /// <param name="minute">minutos indicados</param>
        /// <returns>DateTime con la modificación</returns>
        public static DateTime SetTime(this DateTime current, int hour, int minute)
        {
            return SetTime(current, hour, minute, 0, 0);
        }

        /// <summary>
        /// Modifica un DateTime, para establecer las horas, minutos y segundos que se indiquen
        /// </summary>
        /// <param name="current">fecha indicada</param>
        /// <param name="hour">hora indicada</param>
        /// <param name="minute">minutos indicados</param>
        /// <param name="second">segundos indicados</param>
        /// <returns>DateTime con la modificación</returns>
        public static DateTime SetTime(this DateTime current, int hour, int minute, int second)
        {
            return SetTime(current, hour, minute, second, 0);
        }

        /// <summary>
        /// Modifica un DateTime, para establecer las horas, minutos, segundos y milisegundos que se indiquen
        /// </summary>
        /// <param name="current">fecha indicada</param>
        /// <param name="hour">hora indicada</param>
        /// <param name="minute">minutos indicados</param>
        /// <param name="second">segundos indicados</param>
        /// <param name="millisecond">milisegundos indicados</param>
        /// <returns>DateTime con la modificación</returns>
        public static DateTime SetTime(this DateTime current, int hour, int minute, int second, int millisecond)
        {
            var atTime = new DateTime(current.Year, current.Month, current.Day, hour, minute, second, millisecond);
            return atTime;
        }

        /// <summary>
        /// A partir del resultado de un timepicker (00:00 - 23:59), se obtiene un DateTime.
        /// <p>El date time, tendrá como valores de fecha 01/01/0001</p>
        /// </summary>
        /// <param name="timepicker">Cadena con el valor del timepicker</param>
        /// <returns>Datetime con la fecha</returns>
        public static DateTime getDateTimeFromTimePicker(String timepicker)
        {
            try
            {
                String[] valores = timepicker.Split(':');

                if (valores.Length == 2)
                {
                    var time = Convert.ToDateTime("0001-01-01 " + valores[0] + ":" + valores[1]);
                    return time;
                }
                else
                {
                    return new DateTime(1, 1, 1, 0, 0, 0);
                }
            }
            catch (Exception ex)
            {
                return new DateTime(1,1,1,0,0,0);
            }
        }
    }
}
